#include <stdio.h>  // 提供 scanf, printf 等输入输出函数

int main() {
    // step 1# 读取总树数 N，并初始化死亡标记数组
    int N, M, K;
    scanf("%d", &N);  // 读入总树数量
    int dead[N+1];    // 用于标记每棵树是否死亡，1 表示死亡
    for(int i = 0; i <= N; i++) dead[i] = 0;  // 初始化为全部存活

    // step 2# 读取死亡树的编号，并标记到 dead 数组中
    scanf("%d", &M);  // 死亡树的数量
    for(int i = 0; i < M; i++) {
        int x;
        scanf("%d", &x);     // 读取死亡树编号
        dead[x] = 1;         // 将该编号位置标记为死亡
    }

    // step 3# 读取最多允许补种的数量 K
    scanf("%d", &K);

    // step 4# 使用滑动窗口查找最长连续可补种树区间
    int left = 1, right = 1; // 滑动窗口的左右边界
    int cnt = 0;             // 当前窗口内死亡树数量（需要补种的数）
    int maxLen = 0;          // 最长连续树区间长度

    while (right <= N) {
        if (dead[right]) cnt++;  // 当前树死亡，计数器加1

        // step 5# 若当前死亡树数超过 K，收缩左边界
        while (cnt > K) {
            if (dead[left]) cnt--;  // 左边界是死亡树则补种数减1
            left++;                 // 收缩窗口左边界
        }

        // step 6# 更新最大连续长度
        if (right - left + 1 > maxLen)
            maxLen = right - left + 1;  // 记录最大值

        right++;  // 右边界右移，扩展窗口
    }

    // step 7# 输出最大连续树长度
    printf("%d\n", maxLen);
    return 0;
}
